home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Source Code / Visual Basic Source Code.iso / vbsource / powervww / pvhgr.cpp < prev    next >
C/C++ Source or Header  |  1998-01-05  |  6KB  |  235 lines

  1. //  ____________________________________________________
  2. // |                                                    |
  3. // |  Project:     POWER VIEW INTERFACE                 |
  4. // |  File:        PVHGR.CPP                            |
  5. // |  Compiler:    WPP386 (10.6)                        |
  6. // |                                                    |
  7. // |  Subject:     Support for graphics-mode version    |
  8. // |                                                    |
  9. // |  Author:      Emil Dotchevski                      |
  10. // |____________________________________________________|
  11. //
  12. // E-mail: zajo@geocities.com
  13. // URL:    http://www.geocities.com/SiliconValley/Bay/3577
  14.  
  15. #define uses_basics
  16. #define uses_conio
  17. #define uses_dc
  18. #define uses_hgr
  19. #define uses_string
  20. #define uses_system
  21.  
  22. #define DECLARE_PVHGR
  23. #include "PVuses.h"
  24. #undef DECLARE_PVHGR
  25.  
  26. //100702.14@compuserve.com Mr. Rex
  27. //BDavis1968@aol.com       Stefano
  28.  
  29. /*
  30. Thgr public
  31. */
  32.   Thgr::Thgr( int _xl, int _yl ):
  33.     Titem( _xl, _yl )
  34.   {
  35.     event_mask |= evMOUSE_HGR_DRAG;
  36.     grow_mode = gmGROW_BOTH;
  37.     color = 15;
  38.     buffer = NULL;
  39.     buf_size = 0;
  40.     id = 0xFF;
  41.     for( int i=0; i<HGR_MAX_BUFFERS; i++ )
  42.       if( hgrs[i]==NULL )
  43.       {
  44.         hgrs[i] = this;
  45.         id = i;
  46.         break;
  47.       }
  48.     set_state( isVALID, id!=0xFF );
  49.   }
  50.  
  51.   Thgr::~Thgr( void )
  52.   {
  53.     if( buffer!=NULL ) FREE( buffer );
  54.     if( id    !=0xFF ) hgrs[id] = NULL;
  55.   }
  56.  
  57.   void Thgr::set_color( char _color )
  58.   {
  59.     color = _color;
  60.   }
  61.  
  62.  
  63. /*
  64. Thgr protected
  65. */
  66.   void Thgr::resize( int _xl, int _yl )
  67.   {
  68.     if( set_buf_size( _xl, _yl ) )
  69.     {
  70.       Titem::resize( _xl, _yl );
  71.       refresh();
  72.     }
  73.   }
  74.  
  75.   void Thgr::set_palette( void )
  76.   {
  77.     text_attr = 0;
  78.   }
  79.  
  80.   void Thgr::draw( void )
  81.   {
  82.     txtf( "|r%c%c|l%c", (char)xl, id, (char)yl );
  83.   }
  84.  
  85.   void Thgr::initialize( void )
  86.   {
  87.     resize( xl, yl );
  88.   }
  89.  
  90.  
  91. /*
  92. Tplane public
  93. */
  94.   Tplane::Tplane( int _xl, int _yl ):
  95.     Thgr( _xl, _yl )
  96.   {
  97.     mul_table  = NULL;
  98.     plane0     = NULL;
  99.     plane1     = NULL;
  100.     plane2     = NULL;
  101.     plane3     = NULL;
  102.     plane_size = 0;
  103.   }
  104.  
  105.   void Tplane::clear( void )
  106.   {
  107.     memset( plane0, 0, plane_size );
  108.     memset( plane1, 0, plane_size );
  109.     memset( plane2, 0, plane_size );
  110.     memset( plane3, 0, plane_size );
  111.     if( color&1 ) memset( plane0, 255, plane_size );
  112.     if( color&2 ) memset( plane1, 255, plane_size );
  113.     if( color&4 ) memset( plane2, 255, plane_size );
  114.     if( color&8 ) memset( plane3, 255, plane_size );
  115.   }
  116.  
  117.   void Tplane::set_pixel( int _x, int _y )
  118.   {
  119.     if( _x<0 || _x>hgr_max_x || _y<0 || _y>hgr_max_y ) return;
  120.     char b1=0x80>>(_x%8), b0=~b1;
  121.     int offset=_y*xl+_x/8;
  122.     plane0[offset]&=b0; if( color&1 ) plane0[offset]|=b1;
  123.     plane1[offset]&=b0; if( color&2 ) plane1[offset]|=b1;
  124.     plane2[offset]&=b0; if( color&4 ) plane2[offset]|=b1;
  125.     plane3[offset]&=b0; if( color&8 ) plane3[offset]|=b1;
  126.   }
  127.  
  128.   static  int __xl;
  129.   extern "C" void draw_line_bin( void );
  130.   extern void draw_line( int x1, int y1, int x2, int y2, char *p0, int plstepcolor  );
  131.   #pragma aux draw_line =                       \
  132.   "             push    ebp                     "\
  133.   "             mov     ebp,__xl                "\
  134.   "             call    draw_line_bin           "\
  135.   "             pop     ebp                     "\
  136.   parm [edi] [esi] [ebx] [eax] [edx] [ecx]       \
  137.   modify [eax ebx ecx edx esi edi];
  138.  
  139.   void Tplane::line( int x1, int y1, int x2, int y2 )
  140.   {
  141.     int q;
  142.     if( x1>x2)
  143.     {
  144.       q=x1; x1=x2; x2=q;
  145.       q=y1; y1=y2; y2=q;
  146.     }
  147.     if( x1<0 )
  148.       if( x2<0 ) return;
  149.       else
  150.       {
  151.         y1 = (x2*y1-x1*y2) / (x2-x1);
  152.         x1 = 0;
  153.       }
  154.     if( x2>hgr_max_x )
  155.       if( x1>hgr_max_x ) return;
  156.       else
  157.       {
  158.         y2 = ( (hgr_max_x-x1)*y2 + (x2-hgr_max_x)*y1 ) / (x2-x1);
  159.         x2 = hgr_max_x;
  160.       }
  161.     if( y1>y2 )
  162.     {
  163.       q=x1; x1=x2; x2=q;
  164.       q=y1; y1=y2; y2=q;
  165.     }
  166.     if( y1<0 )
  167.       if( y2<0 ) return;
  168.       else
  169.       {
  170.         x1 = (x1*y2-x2*y1) / (y2-y1);
  171.         y1 = 0;
  172.       }
  173.     if( y2>hgr_max_y )
  174.       if( y1>hgr_max_y ) return;
  175.       else
  176.       {
  177.         x2 = ( (hgr_max_y-y1)*x2 + (y2-hgr_max_y)*x1 ) / (y2-y1);
  178.         y2 = hgr_max_y;
  179.       }
  180.     __xl=xl;
  181.     draw_line( x1, y1, x2, y2, plane0, ((plane1-plane0)<<4)|(color&0x0F) );
  182.   }
  183.  
  184.   void Tplane::draw( char *screen, int l )
  185.   {
  186.     int sx, sy;
  187.     int offset=(int)(screen-(char*)scr_address);
  188.     make_local( offset%80, (offset/80)/16, sx, sy );
  189.     int plane_ofs = sy*xl*16+sx, i;
  190.     char *dest, *src;
  191.     _cli();
  192.     outpw( 0x03CE, 0x0001 );
  193.     outpw( 0x03C4, 0x0102 );
  194.     for( i=17,dest=screen,src=plane0+plane_ofs; --i; dest+=80,src+=xl )
  195.       memcpy( dest, src, l );
  196.     outp ( 0x03C5, 0x02 );
  197.     for( i=17,dest=screen,src=plane1+plane_ofs; --i; dest+=80,src+=xl )
  198.       memcpy( dest, src, l );
  199.     outp ( 0x03C5, 0x04 );
  200.     for( i=17,dest=screen,src=plane2+plane_ofs; --i; dest+=80,src+=xl )
  201.       memcpy( dest, src, l );
  202.     outp ( 0x03C5, 0x08 );
  203.     for( i=17,dest=screen,src=plane3+plane_ofs; --i; dest+=80,src+=xl )
  204.       memcpy( dest, src, l );
  205.     _sti();
  206.   }
  207.  
  208.  
  209. /*
  210. Tplane protected
  211. */
  212.   size_t Tplane::get_buf_size( int _xl, int _yl )
  213.   {
  214.     return (_xl*_yl*16)*4 + _yl*16*sizeof(int);
  215.   }
  216.  
  217.   boolean Tplane::set_buf_size( int _xl, int _yl )
  218.   {
  219.     size_t bs;
  220.     char *new_blk = (char *)REALLOC( buffer, bs=get_buf_size( _xl, _yl ) );
  221.     if( new_blk==NULL ) return 0;
  222.     buffer = new_blk; buf_size = bs;
  223.     hgr_cols=_xl*8; hgr_rows=_yl*16;
  224.     hgr_max_x=hgr_cols-1; hgr_max_y=hgr_rows-1;
  225.     char *b=buffer;
  226.     plane_size=_xl*_yl*16;
  227.     plane0=b, b+=plane_size;
  228.     plane1=b, b+=plane_size;
  229.     plane2=b, b+=plane_size;
  230.     plane3=b, b+=plane_size;
  231.     mul_table = (int*)b;
  232.     for( int i=0,s=0; i<_yl*16; mul_table[i++]=s,s+=_xl );
  233.     return 1;
  234.   }
  235.